/******************************************************
Cours: LOG121
Session: A2012
Groupe: 01
Projet: Laboratoire #1.2
Étudiant(e)s: Guillaume Boulay
              Pierre-Olivier Dubé
              Sébastien Gergel
Professeur et chargé de labo : Patrice Boucher
Nom du fichier: LinkedList.java
Date crée: 2010-10-31
Date dern. modif. 2012-10-31
*******************************************************
Historique des modifications
*******************************************************
2012-10-31 Version initiale (Guillaume Boulay)
*******************************************************/
package utils;

import formes.Forme;

/**
 * Imitation simple de la classe LinkedList de java.
 * 
 * @author Guillaume Boulay
 */
public class LinkedList
{
    private LinkedList next = null;
    private Forme form;
    
    /**
     * Création d'une nouvelle LinkedList. Celle-ci ne fonctionne qu'avec
     * des Forme.
     * 
     * @param form la Forme à ajouté
     */
    public LinkedList(Forme form)
    {
        this.form = form;
    }
    
    /**
     * Retourne la forme de la LinkedList courante.
     * 
     * @return la forme de la LinkedList courante.
     */
    public Forme getForm()
    {
        return this.form;
    }
    
    /**
     * Change la Forme du LinkedList pour celle passé en paramètre.
     * 
     * @param form la nouvelle Forme.
     */
    public void setForm(Forme form)
    {
        this.form = form;
    }
    
    /**
     * Retourne null s'il n'y a pas de LinkedList qui suit.
     * 
     * @return la prochaine LinkedList
     */
    public LinkedList next()
    {
        return this.next;
    }
    
    /**
     * Fonctionne de la même manière qu'un array.
     * 
     * Le premier élément à un index de 0.
     * 
     * Si l'index recherché est "out of bound", null est retourné.
     * 
     * @param index l'index de l'élément recherché
     * @return l'élément recherché
     */
    public LinkedList get(int index)
    {
        LinkedList current = this;
        
        for (int i = 0; i < index; i++) {
            if ((current = current.next()) == null)
                return null;
        }
        
        return current;
    }
    
    /**
     * Ajoute un élément LinkedList à la suite de la file.
     * 
     * @param newList la nouvelle LinkedList.
     */
    public void add(LinkedList newList)
    {
        if (this.next == null) {
            this.next = newList;
        } else {
            LinkedList tmp = this.next;
            
            while (tmp.next() != null) {
                tmp = tmp.next();
            }
            
            tmp.next = newList;
        }
            
    }
}
